package org.whispersystems.bithub.storage; import com.coinbase.api.entity.Transaction; import org.apache.commons.lang3.StringEscapeUtils; import org.joda.time.DateTime; import org.joda.time.format.DateTimeFormat; import org.joda.time.format.DateTimeFormatter; import java.math.BigDecimal; import java.math.RoundingMode; import java.text.ParseException; public class CoinbaseTransactionParser { private final Transaction coinbaseTransaction; public CoinbaseTransactionParser(Transaction coinbaseTransaction) { this.coinbaseTransaction = coinbaseTransaction; } public String parseAmountInDollars(BigDecimal exchangeRate) { return coinbaseTransaction.getAmount().getAmount().abs() .multiply(exchangeRate) .setScale(2, RoundingMode.CEILING) .toPlainString(); } public String parseTimestamp() throws ParseException { DateTime timestamp = coinbaseTransaction.getCreatedAt(); DateTimeFormatter fmt = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ssZ"); return fmt.print(timestamp); } public String parseDestinationFromMessage() { String message = StringEscapeUtils.unescapeHtml4(coinbaseTransaction.getNotes()); int startToken = message.indexOf("__"); if (startToken == -1) { return "Unknown"; } int endToken = message.indexOf("__", startToken + 1); if (endToken == -1) { return "Unknown"; } return message.substring(startToken+2, endToken); } public String parseUrlFromMessage() throws ParseException { String message = StringEscapeUtils.unescapeHtml4(coinbaseTransaction.getNotes()); int urlIndex = message.indexOf("https://"); return message.substring(urlIndex).trim(); } public String parseShaFromUrl(String url) throws ParseException { if (url == null) { throw new ParseException("No url", 0); } String[] parts = url.split("/"); String fullHash = parts[parts.length-1]; if (fullHash.length() < 8) { throw new ParseException("Not long enough", 0); } return fullHash.substring(0, 8); } }